/**
 * Vue-Native Bridge
 * 用于Vue3应用与WinForms原生应用之间的通信
 */

// 回调函数存储
const callbackMap = new Map();
let callbackIdCounter = 0;

// 初始化接收回调的全局函数
window.__receiveNativeCallback = (callbackId, result, error) => {
  const callback = callbackMap.get(callbackId);
  if (callback) {
    callbackMap.delete(callbackId);
    if (error) {
      callback.reject(error);
    } else {
      callback.resolve(result);
    }
  }
};

/**
 * 调用C#中注册的函数
 * @param {string} functionName - 要调用的C#函数名
 * @param {any} data - 要传递的数据
 * @returns {Promise<any>} - 返回C#函数的结果
 */
export function callNativeFunction(functionName, data = null) {
  return new Promise((resolve, reject) => {
    try {
      // 生成唯一的回调ID
      const callbackId = `callback_${Date.now()}_${callbackIdCounter++}`;
      
      // 存储回调函数
      callbackMap.set(callbackId, { resolve, reject });
      
      // 构建消息
      const message = {
        type: 'functionCall',
        function: functionName,
        data: data,
        callbackId: callbackId
      };
      
      // 发送消息到C#
      window.chrome.webview.postMessage(message);
    } catch (error) {
      reject(`调用原生函数失败: ${error.message}`);
    }
  });
}

/**
 * Vue3插件 - 添加$native全局属性
 */
export const NativeBridge = {
  install(app) {
    // 添加全局属性$native，用于调用C#函数
    app.config.globalProperties.$native = {
      /**
       * 调用C#中注册的函数
       * @param {string} functionName - 要调用的C#函数名
       * @param {any} data - 要传递的数据
       */
      call: callNativeFunction,
      
      /**
       * 获取当前用户信息
       * @returns {Promise<Object>} 用户信息
       */
      getCurrentUser: async () => {
        const result = await callNativeFunction('getCurrentUser');
        return JSON.parse(result);
      },
      
      /**
       * 保存数据到C#应用
       * @param {any} data - 要保存的数据
       * @returns {Promise<Object>} 保存结果
       */
      saveData: async (data) => {
        const result = await callNativeFunction('saveData', data);
        return JSON.parse(result);
      },
      
      /**
       * 打开指定的窗体
       * @param {string} formName - 窗体名称
       * @returns {Promise<Object>} 操作结果
       */
      openForm: async (formName) => {
        const result = await callNativeFunction('openForm', { formName });
        return JSON.parse(result);
      }
    };
    
    // 添加事件监听器，用于接收C#发送的事件
    window.addEventListener('system-message', (event) => {
      const customEvent = new CustomEvent('native-system-message', { 
        detail: event.detail 
      });
      window.dispatchEvent(customEvent);
    });
  }
};

/**
 * 创建一个Vue组合式API函数，用于在组件中使用原生功能
 */
export function useNative() {
  return {
    /**
     * 调用C#中注册的函数
     */
    callNative: callNativeFunction,
    
    /**
     * 获取当前用户信息
     */
    getCurrentUser: async () => {
      const result = await callNativeFunction('getCurrentUser');
      return JSON.parse(result);
    },
    
    /**
     * 保存数据到C#应用
     */
    saveData: async (data) => {
      const result = await callNativeFunction('saveData', data);
      return JSON.parse(result);
    },
    
    /**
     * 打开指定的窗体
     */
    openForm: async (formName) => {
      const result = await callNativeFunction('openForm', { formName });
      return JSON.parse(result);
    },
    
    /**
     * 注册系统消息监听器
     */
    onSystemMessage: (callback) => {
      const handler = (event) => {
        callback(event.detail);
      };
      window.addEventListener('native-system-message', handler);
      
      // 返回清理函数
      return () => {
        window.removeEventListener('native-system-message', handler);
      };
    }
  };
}

// 在全局提供一个直接可用的API
window.NativeBridge = {
  call: callNativeFunction
}; 